package com.team2.hospital.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Calendar;
import java.util.Map;

/**
 * JwtUtil类用于处理JWT（JSON Web Token）的生成和验证。
 * 通过HMAC256算法生成和验证token，确保安全性。
 */
public class JwtUtil {

    // 用于签名的密钥，通常在生产环境中应该更复杂并通过配置进行管理
    private static final String SIGNATURE_KEY = "1HU&**UUY**(GNH";

    /**
     * 生成JWT Token，包含传入的用户信息，并设置过期时间。
     *
     * @param claims JWT载荷（即用户信息），使用Map传递键值对
     * @return 生成的JWT Token
     */
    public static String getToken(Map<String, String> claims) {
        // 获取当前时间，并设置过期时间为2天
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DATE, 2); // 设置token过期时间为2天

        // 创建JWT构建器
        JWTCreator.Builder builder = JWT.create();

        // 添加JWT载荷（用户信息）
        claims.forEach(builder::withClaim);

        // 设置token过期时间，并签名
        return builder.withExpiresAt(calendar.getTime())
                .sign(Algorithm.HMAC256(SIGNATURE_KEY)); // 使用HMAC256算法对token进行签名
    }

    /**
     * 验证JWT Token的有效性。
     *
     * @param token 要验证的JWT Token
     * @return DecodedJWT 解码后的JWT对象
     * @throws com.auth0.jwt.exceptions.JWTVerificationException 如果token验证失败，则抛出异常
     */
    public static DecodedJWT verify(String token) {
        // 创建JWT验证器，并使用HMAC256算法验证token的有效性
        return JWT.require(Algorithm.HMAC256(SIGNATURE_KEY))
                .build()
                .verify(token); // 如果验证失败，抛出JWTVerificationException
    }
}
